package com.fengye.redisson.demo.lock;

import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

/**
 * 一次性锁操作流程
 * @author sky
 * @date 2021年06月16日 1:06 下午
 */
@Service
@Slf4j
public class OneLock {
    @Value("${redisson.lock.name:redisson-lock-name}")
    private String redissonLockName;

    @Autowired
    private RedissonClient client;

    /**
     * 一次性锁
     * @param dto
     */
    public void businessWithLock(Object dto) throws Exception {
        RLock lock = client.getLock(redissonLockName);

        try {

            // 共享资源上锁，无论何种情况，10s 后释放该锁
            lock.lock(10, TimeUnit.SECONDS);

            // TODO: 核心业务逻辑
            log.info("注册用户");


        } catch (Exception e) {
            log.error("获取redisson锁失败");
            throw e;
        } finally {

            // TODO: 不管发生何种情况，在处理完核心业务逻辑之后，释放该分布式锁。
            if (lock != null) {
                lock.unlock();
                // 在某些严格的业务场景下，也可以用强制释放分布式锁的方法
                // lock.forceUnlock();

            }
        }
    }
}
